﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using DotNetOpenAuth.OpenId;
using DotNetOpenAuth.OpenId.RelyingParty;
using DotNetOpenAuth.OpenId.Extensions.SimpleRegistration;
using DotNetOpenAuth.Messaging;

using System.Web.Security;
using DotNetOpenAuth.OpenId.Extensions.ProviderAuthenticationPolicy;
using NCT.Framework;
using VISS.API.Users;

namespace VISS.Web.Frontend.Modules.User
{
    public partial class LoginAuthPopupControl : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e) {
            boxLogin.Visible = false;
            string au = Request.QueryString["au"];
            string receiver = ConvertUtils.ToString(Request.QueryString["dnoa.receiver"], "");
            if (receiver.Length <= 0) {
                if (!string.IsNullOrEmpty(au)) {
                    string openIDUrl = string.Empty;
                    if (au.Equals("yahoo")) {
                        openIDUrl = "https://me.yahoo.com/";
                        if (Request.QueryString["url"] != null && Request.QueryString["url"] != "") {
                            Session["url"] = Request.RawUrl.Replace("/loginau?au=yahoo&url=", "");
                        }
                        else {
                            Session["url"] = null;
                        }
                    }
                    else if (au.Equals("google")) {
                        openIDUrl = "https://www.google.com/accounts/o8/id";
                        if (Request.QueryString["url"] != null && Request.QueryString["url"] != "") {
                            Session["url"] = Request.RawUrl.Replace("/loginau?au=google&url=", "");
                        }
                        else {
                            Session["url"] = null;
                        }
                    }
                    boxLogin.ReturnToUrl = Request.RawUrl;
                    boxLogin.Text = openIDUrl;
                    try {
                        boxLogin.LogOn();
                    }
                    catch (ProtocolException ex) {
                        Response.Redirect("/error?t=" + (int)EErrorType.OpenIDNotFound);
                        return;
                    }
                }
            }
            else {
                string email = string.Empty;
                if (au.Equals("yahoo"))
                    email = ConvertUtils.ToString(Request["openid.ax.value.email"]);
                else if (au.Equals("google"))
                    email = ConvertUtils.ToString(Request["openid.ext1.value.alias2"]);
                if (email.Length > 0) {
                    IUser objectUser = StructureMapFactory.GetInstance<IUser>();
                    ECheckEmailResult rs = objectUser.CheckEmailExisted(email);
                    if (rs == ECheckEmailResult.Exist) { //Nếu người dùng đã đăng ký và dùng OpenID để đăng nhập lại

                        //UserEnt userEnt = null;
                        UserContext userSC;
                        EUserLoginResult result = LoginFactory.LoginOpenID(email, false, out userSC);
                        //Nếu đăng nhập thành công
                        if (result == EUserLoginResult.Success) {
                            string strScript = "<script type='text/javascript'>window.opener.valueCallBackLogin('{0}');</script>";
                            if (ConvertUtils.ToString(Session["url"]).Length == 0) {
                                strScript = string.Format(strScript, "/profile?u=" + userSC.UserKey);
                            }
                            else {
                                strScript = string.Format(strScript, Session["url"]);
                            }
                            Response.Clear();
                            Response.Write(strScript);
                        }
                        else {
                            string strScript = "<script type='text/javascript'>window.opener.ErrorCallBackLogin('{0}');</script>";
                            if (result == EUserLoginResult.Deleted || result == EUserLoginResult.Disabled) {
                                strScript = string.Format(strScript, "Tài khoản của bạn đã bị khóa. Vui lòng liên hệ admin để biết thêm chi tiết");
                            }
                            else {
                                strScript = string.Format(strScript, "Lỗi hệ thống!");
                            }
                            Response.Clear();
                            Response.Write(strScript);
                        }
                    }
                    else if (rs == ECheckEmailResult.NotExist) {//Nếu người dùng chưa đăng ký tài khoản tại VISS
                        /*  
                         *  Gán session để phân biệt giữa người dùng bình thường và người dùng OpenID
                         *  Nếu dùng OpenID sẽ ẩn field Email
                         */
                        Session["OPENID"] = email;
                        string strScript = "<script type='text/javascript'>window.opener.valueCallBackRegister('" + email + "');</script>";
                        Response.Clear();
                        Response.Write(strScript);
                    }
                }
            }
        }

        //Event use for when Login by OpenID is success
        protected void OpenIdLogin_LoggedIn(object sender, OpenIdEventArgs e)
        {
            boxLogin.ReturnToUrl = Request.RawUrl;

            ClaimsResponse ProfileFields = e.Response.GetExtension<ClaimsResponse>();
        }
    }
}